package com.hpf.tool.utils;

import java.text.MessageFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

import com.hpf.tool.interfaces.ICallable;
/**
 * 
 * @author hpf
 *
 */
public final class UtilCode {
	/**
	 * 步长
	 */
	private static int STEP_LENGTH = 2;

	/**
	 * 生成随机数
	 * 
	 * @param length 位数 ，默认4位
	 * @return
	 */
	public static String random(int length) {
		if (length == 0) {
			length = 4;
		}
		Number max = Math.pow(10, length);
		int random = new Random(System.nanoTime()).nextInt(max.intValue());
		return String.format(MessageFormat.format("%0{0}d", length), random);
	}

	/**
	 * 获取 UUID
	 * 
	 * @return
	 */
	public static String uUId() {
		String uuid = UUID.randomUUID().toString();
		return uuid.replace("-", "");
	}

	/**
	 * 获取时间戳
	 * 
	 * @return
	 */
	public static String timestamp() {
		return timestamp(new Date());
	}
	/**
	 * 获取时间戳
	 * 
	 * @return
	 */
	public static String timestamp(Date date) {
		if(date == null) { date = new Date() ;}
		return Long.toString(date.getTime());
	}
	/**
	 * 获取时间戳 + N 位随机数
	 * @param n 随机数位数，默认4位
	 * @return
	 */
	public static String timestampAndRandom(int n) {
		return timestamp() + random(n);
	}
	
	/**
	 * 补全内容
	 * @param target 目标字符串
	 * @param length 字符总长度
	 * @param symbol 填充字符
	 * @return
	 */
	public static String fillContent(String target,int length, String symbol){
		int balance = length - target.length();
		StringBuffer sb = new StringBuffer(target);
		for (int i = 0; i < balance; i++) {
			sb.append(symbol);
		}
		return sb.toString();
	}
	
	/**
	 * 补全内容 = 填充字符(0)
	 * @param target 目标字符串
	 * @param length 字符总长度
	 * @return
	 */
	public static String fillContent(String target,int length){
		return fillContent(target, length,"0");
	}
	
	/**
	 * 修剪内容
	 * @param target 目标字符串
	 * @param symbol 修剪字符
	 * @return
	 */
	public static String trimContent(String target,char symbol){
		final char value[] = target.toCharArray();
		int len = value.length;
        int st = 0;
        char[] val = value;

        while ((st < len) && (val[st] <= symbol)) {
            st++;
        }
        while ((st < len) && (val[len - 1] <= symbol)) {
            len--;
        }
        return ((st > 0) || (len < value.length)) ? target.substring(st, len) : target;
	}
	
	/**
	 * 修剪内容 = 修剪字符(0)
	 * @param target 目标字符串
	 * @return
	 */
	public static String trimContent(String target){
		return trimContent(target,'0');
	}
	
	/**
	 * 填充为偶数
	 * @param target
	 * @return
	 */
	public static String fillAsEven(String code) {
		String value = UtilCode.trimContent(code);
		if (UtilsString.isOdd(value.length())) {
			value += "0";
		}
		return value;
	}
	
	/**
	 * 通过父编码生成子编码
	 * @param parentCode 父编码
	 * @param call 获取当前父编码下最大的子编码
	 * @return
	 */
	public static String createCode(String parentCode,ICallable.ICallableIO<String,String> call){
		final String maxCode = call.exce(parentCode);
		String newCode = "";
		if (UtilsString.isNotEmpty(maxCode)) {
			System.out.println("0-----------trimCode(maxCode)=" + fillAsEven(maxCode));
			newCode = (new Integer(fillAsEven(maxCode)) + 1) + "";
			System.out.println("1-----------newCode=" + newCode);
			if (newCode.length() < STEP_LENGTH) {
				newCode = "0" + newCode;
			}
			System.out.println("2-----------newCode=" + newCode);
		} else {
			/**
			 * 若没有子编码，则生成第一个子编码
			 */
			newCode = fillAsEven(parentCode) + "01";
		}

		/**
		 * 父编码链接当前子编码 以 '0'补全位数
		 */
		return fillContent(newCode, parentCode.length());
	}
	/**
	 * 创建主键
	 * @param prefix 前缀
	 * @return
	 */
	public static String createKey(String prefix){
		if(null == prefix){ prefix = "";}
		final long balanceMillis = System.currentTimeMillis()
				- UtilsString.parseDate("2000-01-01", "yyyy-MM-dd").getTime();
		final long balanceSecond = balanceMillis / 1000;
		return prefix + balanceSecond + UtilCode.random(4);
	}
	public static void main(String[] args) {
		System.out.println(UtilCode.trimContent("00001020350456"));
	}
}
